package cn.gson.springboot.model.service;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import cn.gson.springboot.model.dao.*;
import cn.gson.springboot.model.mapper.*;
import cn.gson.springboot.model.pojos.Function;
import cn.gson.springboot.model.pojos.Role;
import cn.gson.springboot.model.vo.FunctionVo;

@Service
@Transactional(rollbackFor=Exception.class)
public class GrantService {
	@Autowired
	private RoleMapper rm;
	
	@Autowired
	private FunctionMapper fm;
	
	@Autowired
	private RoleDao rdao;
	
	@Autowired
	private FunctionDao fdao;
	
	public List<Role> roleList(){
		return rm.roleList();
	}

	
	/**
	 * 初始化授权窗口的数据
	 * @return
	 */
	public List<FunctionVo> grantList(Integer roleId) {
		//处理一级
		List<FunctionVo> funVoList = fm.roleFunctionList(roleId,0);
		for (FunctionVo f1 : funVoList) {
			List<FunctionVo> funList2 = fm.roleFunctionList(roleId, f1.getId());
			for (FunctionVo f2 : funList2) {
				List<FunctionVo> funList3 = fm.roleFunctionList(roleId, f2.getId());
				//直接将2级的集合添加到一级的children
				f2.setChildren(funList3);
			}
			//直接将2级的集合添加到一级的children
			f1.setChildren(funList2);
		}
		return funVoList;
	}
	
	/**
	 * 保存授权
	 */
	public void saveGrant(int roleId,List<Integer> ids) {
		//找到角色对象
		Role role = rdao.findById(roleId).get();
		//得到主控方的集合
		List<Function> functions = role.getFunctions();
		if(functions==null) {
			functions = new ArrayList<>();
	}
		//先清空
		functions.clear();
		//往集合中添加功能的对象
		List<Function> allFuns = (List<Function>) fdao.findAllById(ids);
		functions.addAll(allFuns);
	}
	
	//查询所有一级分类
	public List<Function> allFirstFunction(HttpSession session) {
		JSONArray arr = fm.allFunctionByUser(0);
		List<Function> fun1 = new ArrayList<>();
		for (Object fun : arr) {
			fun1.add(getBean(fun));
		}
		return fun1;
	}

	//封装功能
	private Function getBean(Object fun) {
		JSONObject obj = (JSONObject) fun;
		Function f = new Function();
		f.setFunctionId(obj.getIntValue("function_id"));
		f.setFunctionName(obj.getString("function_name"));
		f.setFunctionIcon(obj.getString("function_icon"));
		f.setFunctionUrl(obj.getString("function_url"));
		return f;
	}
	
	
	public Map<String,List<Function>> allFunctionByUser(HttpSession session) {
		Map<String,List<Function>> map = new HashMap<>();
		//调用1级的查询方法
		List<Function> fun1 = allFirstFunction(session);
		//循环一级，查询一级中对应的二级集合
		for (Function f : fun1) {
			JSONArray arr = fm.allFunctionByUser(f.getFunctionId());
			List<Function> fun2 = new ArrayList<>();
			for (Object fun : arr) {
				fun2.add(getBean(fun));
			}
			//把二级的添加到map集合，以一级的功能名称作为key
			map.put(f.getFunctionName(), fun2);
		}
		return map;
	}
	
	/**
	 * 查询用户的所有三级功能
	 * @param userId
	 * @param parentId
	 * @return
	 */
	public JSONArray allThirdFuns(int userId,int parentId) {
		return fm.allThirdFuns(userId, parentId);	
	}
	
	/**
	 * 查询某用户下的角色和功能
	 * @param userId
	 * @param parentId
	 * @return
	 */
	public JSONArray allfourFuns(int userId,int parentId) {
		return fm.allfourFuns(userId, parentId);	
	}
	/**
	 * 用户登录时，查询该用户所有的功能列表，并且去重
	 */
	public Set<Integer> allFunIdByUser(int userId){
		List<Integer> ids = fm.allFunIdByUser(userId);
		Set<Integer> set = new HashSet<>(ids);
		return set;
	}
}
